package cn.com.yang.thread;

import java.util.concurrent.TimeUnit;

/**
 * hook钩子函数
 * <br>在java中它表示在事件到达终点前进行拦截或监控的一种行为
 * TODO
 * @author yangyijin
 * @since 2024年9月3日-上午9:08:58
 */
public class TestHookThread {

	public static void main(String[] args) {
		/***
		 * JVM进程退出是由于JVM进程中没有活跃的非守护线程，或者收到了系统中断信号，
		 * 向JVM程序注入一个Hook线程，在JVM进程退出的时候，Hook线程会启动执行，
		 * 通过Runtime可以为JVM注入多个Hook线程。
		 * 注意：
		 * 	Hook线程只有在收到退出信号的时候会被执行，
		 *  如果在kill的时候使用了参数 -9，那么Hook线程不会得到执行，进程将立即退出，强制结束
		 */
		Runtime.getRuntime().addShutdownHook(new Thread(()->{
			try {
				System.out.println("hook1函数运行");
				TimeUnit.SECONDS.sleep(2);
			}catch(InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("hook1线程运行结束");
		}));
		Runtime.getRuntime().addShutdownHook(new Thread(()->{
			try {
				System.out.println("hook2函数运行");
				TimeUnit.SECONDS.sleep(2);
			}catch(InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("hook2线程运行结束");
		}));
		System.out.println("main线程运行结束");
	}
}
